package com.neihe.controller;


import cn.dev33.satoken.stp.StpUtil;
import com.neihe.common.enums.DelFlagEnum;
import com.neihe.entity.dto.file.*;
import com.neihe.entity.vo.file.BreadcrumbVO;
import com.neihe.entity.vo.file.FolderTreeNodeVO;
import com.neihe.entity.vo.file.UserFileVO;
import com.neihe.service.IUserFileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 文件模块
 *
 * @author neihe
 * @since 2025-01-05
 */
@Slf4j
@RestController
public class FileController {

    @Autowired
    private IUserFileService userFileService;

    /**
     * 文件秒传
     *
     * @param requestParam 请求参数
     * @return 是否需要秒传
     */
    @PostMapping("/api/file/private/skip-upload")
    public String skipUpload(@Valid @RequestBody UploadFileDTO requestParam) {
        return userFileService.skipUpload(requestParam);
    }

    /**
     * 获取上传签名
     *
     * @param fileSize 文件大小
     * @return 签名信息
     */
    @GetMapping("/api/file/private/upload-sign")
    public Map<String, String> getUploadSign(@RequestParam Long fileSize) {
        return userFileService.getUploadSign(fileSize);
    }

    /**
     * OSS上传成功回调
     *
     * @param request 请求对象
     */
    @PostMapping("/api/file/public/callback")
    public void ossCallback(HttpServletRequest request) {
        userFileService.ossCallback(request);
    }

    /**
     * 查询文件集合
     *
     * @param parentId 父文件夹ID
     * @return 结果
     */
    @GetMapping("/api/file/private/list")
    public List<UserFileVO> list(@RequestParam Long parentId) {
        QueryFileListContextDTO context = new QueryFileListContextDTO();
        context.setParentId(parentId);
        context.setUserId(StpUtil.getLoginIdAsLong());
        context.setDelFlag(DelFlagEnum.NO.getCode());
        return userFileService.getFileList(context);
    }

    /**
     * 创建文件夹
     *
     * @param requestParam 请求参数
     * @return 新文件夹ID
     */
    @PostMapping("/api/file/private/folder")
    public Long createFolder(@Valid @RequestBody CreateFolderDTO requestParam) {
        requestParam.setUserId(StpUtil.getLoginIdAsLong());
        return userFileService.createFolder(requestParam);
    }

    /**
     * 查询面包屑列表
     *
     * @param fileId 文件ID
     * @return 结果
     */
    @GetMapping("/api/file/private/breadcrumbs")
    public List<BreadcrumbVO> getBreadcrumbs(@RequestParam Long fileId) {
        Long userId = StpUtil.getLoginIdAsLong();
        return userFileService.getBreadcrumbs(fileId, userId);
    }

    /**
     * 修改文件名接口
     *
     * @param requestParam 请求参数
     */
    @PostMapping("/api/file/private/rename")
    public void updateFilename(@Valid @RequestBody UpdateFilenameDTO requestParam) {
        userFileService.updateFilename(requestParam);
    }

    /**
     * 文件放入回收站
     *
     * @param requestParam 请求参数
     */
    @PostMapping("/api/file/private/recycle")
    public void recycleFile(@Valid @RequestBody RecycleFileDTO requestParam) {
        userFileService.recycleFile(requestParam);
    }

    /**
     * 查询文件夹树结构
     *
     * @return 结果
     */
    @GetMapping("/api/file/private/folder/tree")
    public List<FolderTreeNodeVO> getFolderTree() {
        Long userId = StpUtil.getLoginIdAsLong();
        return userFileService.getFolderTree(userId);
    }

    /**
     * 转移文件
     *
     * @param requestParam 请求参数
     */
    @PostMapping("/api/file/private/transfer")
    public void transfer(@Valid @RequestBody TransferFileDTO requestParam) {
        userFileService.transfer(requestParam);
    }

    /**
     * 文件下载
     *
     * @param fileId 文件ID
     * @return 文件的下载链接
     */
    @GetMapping("/api/file/private/download")
    public String download(@RequestParam Long fileId) {
        Long userId = StpUtil.getLoginIdAsLong();
        return userFileService.download(fileId, userId);
    }

    /**
     * 文件预览
     *
     * @param fileId 文件ID
     * @return 文件的下载链接
     */
    @GetMapping("/api/file/private/preview")
    public String preview(@RequestParam Long fileId) {
        Long userId = StpUtil.getLoginIdAsLong();
        return userFileService.preview(fileId, userId);
    }
}
